package cn.wen.yinxiu.works.service;

import cn.wen.yinxiu.common.to.works.SimpleWorksTO;
import cn.wen.yinxiu.common.vo.UserWithStatusReq;
import cn.wen.yinxiu.works.entity.DiagnosisEntity;
import cn.wen.yinxiu.works.to.HeaderNavUserInfoTO;
import cn.wen.yinxiu.works.vo.*;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.wen.yinxiu.common.toolkit.PageUtils;
import cn.wen.yinxiu.works.entity.WorksEntity;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 *
 * @ClassName: WorksService
 * @Author 小飞
 * @Email coderwen22@163.com
 * @Date 2023-05-22 09:39:56
 * @Description: 的Service类
 */
public interface WorksService extends IService<WorksEntity> {

    PageUtils queryPage(Map<String, Object> params);

    /**
     * 获取当前作品数量
     * @param userId
     * @return
     */
    Long queryWorksListCount(Long userId);

    /**
     * 获取用户头部导航栏
     * 作品数量、用户收藏数量、用户浏览记录、我的喜欢数量
     * @param userId
     * @return
     */
    HeaderNavUserInfoTO queryWorksHeadNavCount(Long userId);

    /**
     * 获取用户个人作品列表
     * @param userId
     * @param keyword
     * @param page
     * @return
     */
    List<WorksListInfo> queryWorksList(Long userId, String keyword, Integer page);

    /**
     * 获取用户喜欢作品列表
     * @param userId
     * @param page
     * @param keyword
     * @return
     */
    List<WorksListInfo> queryWorksLikeList(Long userId, Integer page, String keyword);

    /**
     * 获取用户收藏作品列表
     * @param userId
     * @param page
     * @return
     */
    List<WorksListInfo> queryWorksCollectList(Long userId, Integer page);

    /**
     * 获取用户浏览历史记录 （七天之内其他的定时任务删除）
     * @param userId
     * @param page
     * @return
     */
    List<WorksListInfo> queryWorksVisitHistoryList(Long userId, Integer page);

    /**
     * 获取朋友的作品列表 （通过发布时间+权重来推荐）
     * @param userId
     * @param page
     * @return
     */
    List<WorksVO> queryFriendWorksList(Long userId, Integer page);

    /**
     * 通过作品状态来获取作品列表
     * @param req
     * @return
     */
    List<WorksListInfo> queryWorksList(UserWithStatusReq req);

    /**
     * 清除用户的浏览历史
     *
     * @param userId
     * @return
     */
    boolean deleteWorksVisitHistory(Long userId);

    /**
     * 获取用户创作者中心的首页数据
     *
     * @param userId
     * @param dayNum
     * @return
     */
    ServeHomeInfo getServeHomeInfo(Long userId, Integer dayNum);

    /**
     * 添加作品信息
     * @param fileList
     * @param worksJson
     * @return
     */
    boolean addWorksInfo(MultipartFile[] fileList, String worksJson);

    /**
     * 根据存在的数据字段修改
     *
     * @param updateWorksVO
     * @return
     */
    boolean updateWorksById(MultipartFile files, String updateWorksVO);

    /**
     * 统计所有用户的数据信息
     *
     * @return
     */
    boolean statisticsWorksData();

    /**
     * 获取评论管理作品基本信息
     *
     * @param userId
     * @return
     */
    List<WorksSimpleInfo> getCommentWorksList(Long userId);

    /**
     * 通过WorksId获取信息
     * @param worksId
     * @return
     */
    WorksEntity getWorksInfoById(Long worksId);

    /**
     * 批量获取用户作品基本信息数据
     * @param userIds
     * @param startTime
     * @param endTime
     * @param status
     * @param isDeleted
     * @return
     */
    List<DiagnosisEntity> selectWorksDiagnosisByUser(List<Long> userIds, String startTime, String endTime, Integer status, Integer isDeleted);

    /**
     * 根据用户ID 和 选择周期 查看字段来实现
     * @param userId
     * @param period
     * @param filedType
     * @return
     */
    ServeHomeInfo getWorksCoreTendency(Long userId, Integer period, Integer filedType);

    /**
     * 获最近30天发布、表现优异的作品总结
     * 播放量最高、点赞最高、收藏最高、评论最高
     *
     * @param userId
     * @return
     */
    List<WorksSummaryVO> getWorksSummaryList(Long userId);

    /**
     * 获取指数等信息
     *
     * @param userId
     * @return
     */
    List<WorksCartVO> getWorksCartList(Long userId);

    /**
     * 获取周报信息
     * @param userId
     * @return
     */
    WeekReportVO getWeekReportInfo(Long userId);

    /**
     * 创建周报
     *
     * @return
     */
    boolean createWeekReportInfo();

    /**
     * 通过时间周期获取最佳作品
     *
     * @param lastWeekStartTime
     * @param lastWeekEndTime
     * @return
     */
    WorksEntity getWorksBestInfoByTime(Long userId, String lastWeekStartTime, String lastWeekEndTime);

    /**
     * 通过作品ID获取简易的信息
     * @param worksId
     * @return
     */
    SimpleWorksTO getWorksSimpleInfo(Long worksId);

    /**
     * 生成推荐话题列表
     *
     * @param userId
     * @return
     */
    boolean createRecommendList(Long userId);

    /**
     * 获取推荐作品数据
     *
     * @param userId
     * @param page
     * @return
     */
    List<WorksVO> getRecommendList(Long userId, Integer page);

    /**
     * 首页获取信息
     *
     * @param userId
     * @return
     */
    List<WorksSimpleInfo> getHomeList(Long userId);

    /**
     * 获取关注列表数据
     * @param userId
     * @return
     */
    List<WorksVO> getFollowList(Long userId);

    /**
     * 获取朋友的数据
     *
     * @param userId
     * @return
     */
    List<WorksVO> getFriendList(Long userId);

    /**
     * 获取热点数据
     *
     * @param userId
     * @return
     */
    List<WorksSimpleInfo> getHotWorksList(Long userId);

    /**
     * 获取分类ID的数据
     *
     * @param userId
     * @param typeId
     * @return
     */
    List<WorksSimpleInfo> getTypeWorksList(Long userId, Long typeId);

    /**
     * 获取随机作品列表
     *
     * @return
     */
    List<WorksVO> getRandomWorksList();

    /**
     * 自增作品的数量
     *
     * @param worksId
     * @param num
     */
    void updateWorksCommentNum(Long worksId, Integer num);

    /**
     * 作品点赞
     *
     * @param worksId
     * @param userId
     * @return
     */
    boolean worksLikeById(Long worksId, Long userId);

    /**
     * 作品取消点赞
     *
     * @param worksId
     * @param userId
     * @return
     */
    boolean worksUnlikeById(Long worksId, Long userId);

    /**
     * 收藏作品
     *
     * @param worksId
     * @param userId
     * @return
     */
    boolean worksCollectById(Long worksId, Long userId);

    /**
     * 取消收藏作品
     *
     * @param worksId
     * @param userId
     * @return
     */
    boolean worksCancelCollectById(Long worksId, Long userId);

    /**
     * 将商品ID存入到作品ID中
     *
     * @param worksId
     * @param productId
     * @return
     */
    boolean saveWorksProductId(Long worksId, Long productId);

    /**
     * 将商品ID从指定的作品中移除
     *
     * @param worksId
     * @return
     */
    boolean deleteWorksProductId(Long worksId);

    /**
     * 将广告ID存入到指定作品中
     *
     * @param worksId
     * @param advertId
     * @return
     */
    boolean saveWorksAdvertId(Long worksId, Long advertId);

    /**
     * 将作品ID存入到广告ID中
     * @param worksId
     * @return
     */
    boolean deleteWorksAdvertId(Long worksId);

    /**
     * 获取作品列表设计学校
     * @return
     */
    List<WorksSimpleInfo> getSimpleRandomWorksList();
}

